/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TiposGenericos_JFrameCollections;

import java.util.Iterator;

/**
 *
 * @author KAREL
 */
public class ListaEnlazadaIterator_Pregunta5<E> implements Iterator<E> {
    protected E datos;
    protected CNodo<E> primero;
    int tamaño = 0;

    public ListaEnlazadaIterator_Pregunta5() {
        this.datos= null;
        this.primero=null;
    }

    public int longitud(){
        return this.longitud();
    }
    public ListaEnlazadaIterator_Pregunta5(E dato, CNodo<E> siguiente) {
        this.datos = dato;
        this.primero = siguiente;
    }
    //en este metodo insertaremos elementos
    public void insertar(E y){
        CNodo<E> nuevo = new CNodo<E>(y);
        //para que sea enlazada el nuevo siguiente debera 
        //apuntar al primero
        
        nuevo.siguiente=primero;
        //y el primero al nuevo
        primero=nuevo;
        //el tamaño que se incremente 
        this.tamaño++;
        /*
         * si deseariamos reducir el codigo:
         * primero = new CNodo<E>(y,primero);this.talla++;
         */
        
    }
    public void InsertarAlFinal(E y){
        CNodo<E> n1 = new CNodo<E>(y);
        this.tamaño++;
        CNodo<E> aux = primero;
        if(aux==null)
        {
            primero=n1;
        }
        else{
            while(aux.siguiente != null)
            {
                aux=aux.siguiente;
                //aux hace referencia al ultimo nodo de la lista
                aux.siguiente=n1;
            }
        }
    }
    public boolean eliminar(E y){
        CNodo<E> auxiliar = primero,anterior=null;
        boolean respuesta= false;
        while( auxiliar!= null && auxiliar.dato.equals(y)){
            anterior = auxiliar;
            auxiliar=auxiliar.siguiente;
        }
        if (auxiliar!= null){
            respuesta = true;
            this.tamaño--;
            if(anterior==null){
                //si se desea borrar el primer elemento
                primero=auxiliar.siguiente;
                
            }
            else{
                anterior.siguiente=auxiliar.siguiente;
            }
        }
        return respuesta;
    }
    
    @Override
    public String toString(){
        String respuesta="";
        for (CNodo<E> b = primero; b != null ;b = b.siguiente)
            respuesta +=  b.dato.toString()+"\n";
        return respuesta;
    }

    public Iterator<E> iterator() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    //metodos para que sea iterator
    

    @Override
    public boolean hasNext() {
        boolean bandera = false;
        if (primero!=null){
            if(primero.siguiente!=null)
                bandera = true;
        }
        return bandera;
    }
    @Override
    public E next() {
        if (hasNext()){
            return primero.siguiente.dato;
        }
        else return (E)"No hay elementos";
    }

    @Override
    public void remove() {
        eliminar(next());
    }


   
    
  
           
  

    
}
